(function anonymous(window) {
    //默认的参数配置
    let _default = {
        method:'GET',
        //请求地址
        url:'',
        //默认请求地址前半部
        baseURL :'',
        //头部
        headers:{},
        dataType:'JOSN',
        //post 请求所用的参数
        data:null,
        //get 请求所用的参数
        params:null
    }; 
    //基于 promise设计ajax
    let ajaxPromise = function ajaxPromise(options = {}) {
        //options 中融合了默认配置信息 用户基于 default修改get post方法
        let {
            url,
            baseURl,
            method,
            data,
            dataType,
            headers,
            cache,
            params
        } = options 
        //把请求传递的参数进一步处理
        if(/^(GET|DELETE|HEAD|OPTIONS)$/i.test(method)){
            // get方法
            if(params){
                //拼接
                url += `${ajaxPromise.check(url)}${ajaxPromise.formatData(params)}`
            }
            if(cache === false){
                //清理缓存
                url += `${ajaxPromise.check(url)}_=${+(new  Date())}`
            }
            data = null //get为null
        }else{
            //post系列
            if(data){
                
                data = ajaxPromise.formatData(data)
            }
        }
        //基于promise 发送ajax
        return new Promise((resolve,reject) =>{
            //创建ajax服务
            let xhr = new XMLHttpRequest;
            //发送请求
            xhr.open(method,url);
            //设置请求头 不能用中文字符
            if(headers !== null &&  typeof headers === "object"){
                for (let attr in headers){
                    if( headers.hasOwnProperty(attr)){
                        let val = headers[attr]
                        if(/[\u4e00-\u9fa5]/.test(val)){
                            //有中文我们将字符转换
                            val = encodeURIComponent(val);
                        }
                        xhr.setRequestHeader(attr,val);
                    }
                }
            }
            //返回结果 
            xhr.onreadystatechange = ()=>{
                // 4为完成
                if(xhr.readyState === 4){
                    //200 或者300
                    if(/^(2|3)\d{2}$/.test(xhr.status)){
                        let result = xhr.responseText;
                        dataType = dataType.toUpperCase();
                        dataType === "JSON"?result = JSON.parse(result):(dataType === 'XML' ?result = xhr.responseXML:null);
                        resolve(result,xhr);
                        return;
                    }
                    // 返回
                    reject(xhr.statusText,xhr);
                }
            }
            //发送参数
            xhr.send(data);
        })



    };
    //将默认配置暴露出去 后期用户可以进行自己配置 
    ajaxPromise.default = _default;
    //转换请求格式 将参数拼接
    ajaxPromise.formatData = function formatData(obj) {
        let str = ``;
        for(let attr in obj){
            if(obj.hasOwnProperty(attr)){
                str += `${attr} = ${obj[attr]}`
            }
        }
        return str.substring(0,str.length - 1);
    }
    //清理
    ajaxPromise.check = function check(url) {
        return url.indexOf('?')>-1?'&':'?'
    }
    // get等操作
    ['get','delete','head','options'].forEach(item =>{
        ajaxPromise[item] = function anonymous(url,options = {}){
            options = {
                //默认值
                ..._default,
                //用户传递的配置
                ...options,
                //用户传递的url 请求地址
                url:url,
                //以后执行不设置的时候默认
                method:item.toUpperCase()};
            return ajaxPromise(options)
        }
    })
    //post等操作
    ['post','put','patch'].forEach(item =>{
        ajaxPromise[item] = function anonymous(url,data = {},options = {}){
            options = {
                //默认值
                ..._default,
                //用户传递的配置
                ...options,
                //用户传递的url 请求地址
                url:url,
                //以后执行不设置的时候默认
                method:item.toUpperCase(),
                //参数
                data:data,
            }
            return ajaxPromise(options)
        }
    })
    window.ajaxPromise = ajaxPromise;
})(window);